package dht.data;

import dse.modules.eln.EarthLikeNetwork;

public class MessageUtil {

	public double waitingCost;
	public double processCost;
	public double sendTime;

	public static boolean isServer2ClientMsg(Message msg) {
		if (msg.msgType == MessageType.READ_RESP
				|| msg.msgType == MessageType.WRITE_RESP
				|| msg.msgType == MessageType.READ_FWD
				|| msg.msgType == MessageType.WRITE_FWD) {
			return true;
		}
		return false;
	}

	public static boolean isServer2ServerMsg(Message msg) {
		if (msg.msgType == MessageType.SPLIT_MOVE_REQ
				|| msg.msgType == MessageType.SPLIT_MOVE_RESP
				|| msg.msgType == MessageType.SPLIT_MOVE_ACK) {
			return true;
		}
		return false;
	}

	public static boolean isServer2MasterMsg(Message msg) {
		if (msg.msgType == MessageType.TABLE_REQ
				|| msg.msgType == MessageType.TABLE_ACK
				|| msg.msgType == MessageType.SPLIT_RESP
				|| msg.msgType == MessageType.SPLIT_FLUSH_REQ
				|| msg.msgType == MessageType.SPLIT_FLUSH_ACK) {
			return true;
		}
		return false;
	}

	public static boolean isClient2ServerMsg(Message msg) {
		if (msg.msgType == MessageType.READ_REQ
				|| msg.msgType == MessageType.READ_ACK
				|| msg.msgType == MessageType.WRITE_REQ
				|| msg.msgType == MessageType.WRITE_ACK
				|| msg.msgType == MessageType.READ_FWD_ACK
				|| msg.msgType == MessageType.WRITE_FWD_ACK) {
			return true;
		}
		return false;
	}

	public static boolean isClient2MasterMsg(Message msg) {
		if (msg.msgType == MessageType.META_READ_REQ
				|| msg.msgType == MessageType.META_READ_ACK) {
			return true;
		}
		return false;
	}

	public static boolean isMaster2ServerMsg(Message msg) {
		if (msg.msgType == MessageType.TABLE_RESP
				|| msg.msgType == MessageType.SPLIT_REQ
				|| msg.msgType == MessageType.SPLIT_ACK
				|| msg.msgType == MessageType.SPLIT_FLUSH_RESP) {
			return true;
		}
		return false;
	}

	public static boolean isMaster2ClientMsg(Message msg) {
		if (msg.msgType == MessageType.META_READ_RESP) {
			return true;
		}
		return false;
	}

	public static Message messageGen(Access access, EarthLikeNetwork network) {
		Message msg = new Message();
		msg.accessId = access.accessId;
		msg.fromId = access.requesterId;
		msg.toId = NetworkUtil.getEntry(msg.fromId);
		msg.generateTime = access.startTime;
		if (access.accessType == AccessType.READ) {
			msg.msgType = MessageType.READ_REQ;
		} else if (access.accessType == AccessType.WRITE) {
			msg.msgType = MessageType.WRITE_REQ;
		}
		return msg;
	}

	public static Message messageGen(Message msg) {
		Message newMsg = new Message();
		newMsg.accessId = msg.accessId;
		newMsg.fromId = msg.toId;
		newMsg.toId = msg.fromId;
		newMsg.generateTime = msg.sendTime + msg.networkCost;
		return newMsg;
	}

	/********** for directory ***************/
	public static boolean isDirClient2MasterMsg(Message msg) {
		if (msg.msgType == MessageType.DIR_META_READ_REQ
				|| msg.msgType == MessageType.DIR_META_READ_ACK
				|| msg.msgType == MessageType.DIR_META_WRITE_REQ
				|| msg.msgType == MessageType.DIR_META_WRITE_ACK) {
			return true;
		}
		return false;
	}

	public static boolean isDirMaster2ClientMsg(Message msg) {
		if (msg.msgType == MessageType.DIR_META_READ_RESP
				|| msg.msgType == MessageType.DIR_META_WRITE_RESP) {
			return true;
		}
		return false;
	}

	public static boolean isDirClient2ServerMsg(Message msg) {
		if (msg.msgType == MessageType.DIR_DATA_READ_REQ
				|| msg.msgType == MessageType.DIR_DATA_READ_ACK
				|| msg.msgType == MessageType.DIR_DATA_WRITE_REQ
				|| msg.msgType == MessageType.DIR_DATA_WRITE_ACK) {
			return true;
		}
		return false;
	}

	public static boolean isDirServer2ClientMsg(Message msg) {
		if (msg.msgType == MessageType.DIR_DATA_READ_RESP
				|| msg.msgType == MessageType.DIR_DATA_WRITE_RESP) {
			return true;
		}
		return false;
	}
}
